﻿using _16._1面向对象_访问修饰符;
using System;

namespace _16面向对象_访问修饰符
{
    class Program
    {

        static void Main(string[] args)
        {
            //访问修饰符可夸类类型使用
            var p1 = new Person();
            var str = p1.name;
            //private不可跨类类型使用
            //var mm = p1.秘密;
            Dog dog = new Dog("旺财");
            Console.WriteLine($"狗狗的名字叫{dog.name}");

            //protected 访问修饰符不可外部访问
            //Baohude bao = new Baohude("小小");
            //var zcm = bao.保护的;

            // internal 访问修饰符的同一个程序集的外部访问 
            var mw = p1.密文;
            var p2 = new Person();
            var mw1 = p2.密文;
            var ck = p2.存款;


        }
    }
    //访问修饰符
    //1.public : 公开的，可跨类型访问，可夸程序集访问，可访问类 类型，类中成员
    //2.private : 私有的，只能在当前类型中访问(class,struct),命名空间不能用private，只能用(public,internal)
    //3.protected : 保护的，在当前类型中访问,在继承类中访问，修饰类型成员
    //4.internal : 只能在同一个程序集访问，不可跨程序集访问 ，修饰的是类类型、类中的成员
    //5. protected internal : 不能在命名空间中对类类型进行修饰 ，类中类可以,不能跨程序集，能够在继承类中访问，能够在继承类之外访问。

    public class Person
    {
        public string name;
        private string 秘密;
        protected string 保护的;
        internal string 密文;
        protected internal int 存款;

    }

    public class Baohude : Person
    {
        public void Mimishi()
        {
            //Internal 访问修饰符 继承类中可访问
            Console.WriteLine(this.保护的);
            //private继承类中不可访问
            //Console.WriteLine(this.秘密);

            var ck = this.存款;
        }
    }

    internal class InternalA
    {
        public string name;
    }


    //访问修饰符的其他注意事项：
    /*
     * 1. Interface ：抽象成员不能有访问修饰符，方法一旦有访问修饰符就必须实现
     * 2. 枚举的成员不能有访问修饰符,有则导致IDE紊乱
     * 3. 枚举本身在命名空间中不能用 private 等，和 class 规则保持一致。
     */
    // 默认是 internal
    enum Meiju
    {
        冰红茶,
    }

    //委托访问修饰符
    //默认是 internal, internal:内部的
    delegate void Weituo();
    delegate void Weituo();
}
